import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @Authther: mrwu
 * @date:2021/3/4-03
 * @Description:PACKAGE_NAME
 */
public class Main {
    public static void main(String[] args) throws Exception {

        Class stdClass = Student.class;
        //获取public 字段""score
        System.out.println(stdClass.getField("score"));
        //获取继承的name
        // 父类中对应字段不加public 无法获取
//        System.out.println(stdClass.getField("name"));
        //获取私有字段 grade
//        System.out.println(stdClass.getField("grade"));//无法获取
        System.out.println(stdClass.getDeclaredField("grade"));//可以获取
        // getfield 根据字段名获取被public修饰的字段 getdeclaredfiled 根据字段名获取当前类的某个field（不包括父类）
        // getfields 获取包含父类的所有被public 修饰的字段
        // getdeclaredfileds 获取本类的所有字段不包含父类
        for (Field f:stdClass.getDeclaredFields()
             ) {
            System.out.println("----"+f.getName()+"类型"+f.getType());
        }
        // 获取字段值
         Object p = new Person("xiao wu");
        Field namef = p.getClass().getDeclaredField("name");
        namef.setAccessible(true);//设置允许访问所有属性
        Object value = namef.get(p);
        System.out.println(value);
        // 修改对象的值
         namef.set(p, "xiao ming");
        System.out.println(((Person) p).getName());
        // 获取对象的方法 同获取属性一样
        System.out.println(stdClass.getDeclaredMethods());
         //Method getMethod(name, Class...)：获取某个public的Method（包括父类）
        //Method getDeclaredMethod(name, Class...)：获取当前类的某个Method（不包括父类）
        //Method[] getMethods()：获取所有public的Method（包括父类）
        //Method[] getDeclaredMethods()：获取当前类的所有Method（不包括
        //遍历对象的方法
        for (Method m:stdClass.getDeclaredMethods()
             ) {
            System.out.println(m.getName()+"方法名称是");
            System.out.println();
        }
        //getmethod 获取public 参数
        System.out.println(p.getClass().getMethod("intruduce"));
        //总结getmethod 和getdeclaredmethod 都可以获取当前类的public 方法
        //getdeclaredmethod 可以获取当前类的private方法

    }
}
class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public Person() {
    }
    public void intruduce(){
        System.out.println("我是一个人");
    }
}
class Student extends Person{
   public int score;
   private int grade;
   public void study(){
       System.out.println("我会学习");
   }
}